iOS TextField 关于中文字数限制包含表情

##TextField 限制字数的方法

  • 代理限制字数
    -(BOOL)textField:(UITextField )textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString )string;
    用这个方法来进行字数限制,但是这个方法到现在也不能限制中文,这个方法给我最多的就是用在做限制手机号码等纯数字或者密码输入等数字英文字符的限制😂
  • 通知
    在viewdidload注册一个通知

    1
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldEditChanged:) name:UITextFieldTextDidChangeNotification object:_textField.text];
  • 往textfield添加一个Target

    1
    [_textField addTarget:self action:@selector(textFieldEditChanged:) forControlEvents:UIControlEventEditingChanged];
  • 就上面三种方法而言,我个人会使用第三种方法,理由嘛~就是能不用通知就不用通知~
    下面来说具体方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    NSInteger length;//定义length来保存字数
    -(void)textFieldEditChanged:(UITextField *)textField
    {


    //字数限制
    NSInteger WordCount = 10;
    NSString *toBeString = textField.text;
    UITextRange *selectedRange = [textField markedTextRange];
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
    if (!position)
    {
    if (toBeString.length > WordCount && textField.markedTextRange == nil)
    {
    NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:WordCount];
    if (rangeIndex.length == 1)
    {
    textField.text = [toBeString substringToIndex:WordCount];
    }
    else
    {
    textField.text = [toBeString substringWithRange:NSMakeRange(0, length)];
    }
    } else {
    length = toBeString.length;
    }
    }
    }

###总结
现在对于字数限制,我是比较推荐使用我现在用的这种,符合中文的需求
之前其实并没有写那么复杂,只是写了如果大于字数限制,就直接切割多少个字符限制的字符串
后来因为发现表情会占用两个字节,如果你最后刚好9个,多一个表情就会变成11,切割变成了10,就会照成表情的不完整,会出现比较严重的bug,在网上综合例子弄了自己最适合的,或许有更好的,欢迎拍砖~

虽然觉得自己学的不好,但也是慢慢累积,希望有一天能够帮助到别人,不能一味的总是获取别人的成果.